package 二叉树;

/**
 * N 叉树的最大深度
 * 给定一个 N 叉树，找到其最大深度。
 * <p>
 * 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
 * User: zhaixiaolong Date:2024/2/23 15:32 ProjectName: algorithm Version:
 */
public class 二叉树深度 {

    public static void main(String[] args) {

    }

    /**
     * 104. 二叉树的最大深度
     *
     * @param root
     * @return
     */
    public int maxDepth2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth2(root.left);
        int rightDepth = maxDepth2(root.right);
        int maxDepth = Math.max(leftDepth, rightDepth) + 1;
        return maxDepth;
    }

    /**
     * N 叉树的最大深度
     * 递归
     *
     * @param root
     * @return
     */
    public static Integer maxDeep(TreeNode root) {
        // 临界条件，叶子节点
        if (root == null) {
            return 0;
        }
        int maxDeep = 0;

        return maxDeep + 1;

    }

    /**
     * 111. 二叉树的最小深度
     * 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
     * 是到最近的叶子节点。如果子树为空，那就没有叶子节点。
     *
     * @param root
     * @return
     */
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //左子树
        int leftDepth = minDepth(root.left);
        //左子树
        int rightDepth = minDepth(root.right);
        //左子树为空的情况
        if (root.left == null && root.right != null) {
            return rightDepth + 1;
        }
        //右子树为空的情况
        if (root.right == null && root.left != null) {
            return leftDepth + 1;
        }
        return Math.min(leftDepth, rightDepth) + 1;
    }

    /**
     * 222. 完全二叉树的节点个数
     *
     * @param root
     * @return
     */
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftCount = countNodes(root.left);
        int rightCount = countNodes(root.right);
        return leftCount + rightCount + 1;
    }

}
